/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Persistencia.exceptions.NonexistentEntityException;
import Persistencia.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import motoressa.Vehiculo;
import motoressa.Operacion;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;
import motoressa.GrupoDeConstruccion;
import motoressa.Repuesto;

/**
 *
 * @author HP
 */
public class GrupoDeConstruccionJpaController implements Serializable {

    public GrupoDeConstruccionJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public GrupoDeConstruccionJpaController() {
        emf=Persistence.createEntityManagerFactory("MotoresSAPU");
    }
    

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(GrupoDeConstruccion grupoDeConstruccion) throws PreexistingEntityException, Exception {
        if (grupoDeConstruccion.getMisOperaciones() == null) {
            grupoDeConstruccion.setMisOperaciones(new ArrayList<Operacion>());
        }
        if (grupoDeConstruccion.getMisRepuestos() == null) {
            grupoDeConstruccion.setMisRepuestos(new ArrayList<Repuesto>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Vehiculo miVehiculo = grupoDeConstruccion.getMiVehiculo();
            if (miVehiculo != null) {
                miVehiculo = em.getReference(miVehiculo.getClass(), miVehiculo.getNumeroPatente());
                grupoDeConstruccion.setMiVehiculo(miVehiculo);
            }
            List<Operacion> attachedMisOperaciones = new ArrayList<Operacion>();
            for (Operacion misOperacionesOperacionToAttach : grupoDeConstruccion.getMisOperaciones()) {
                misOperacionesOperacionToAttach = em.getReference(misOperacionesOperacionToAttach.getClass(), misOperacionesOperacionToAttach.getCodigo());
                attachedMisOperaciones.add(misOperacionesOperacionToAttach);
            }
            grupoDeConstruccion.setMisOperaciones(attachedMisOperaciones);
            List<Repuesto> attachedMisRepuestos = new ArrayList<Repuesto>();
            for (Repuesto misRepuestosRepuestoToAttach : grupoDeConstruccion.getMisRepuestos()) {
                misRepuestosRepuestoToAttach = em.getReference(misRepuestosRepuestoToAttach.getClass(), misRepuestosRepuestoToAttach.getCodigo());
                attachedMisRepuestos.add(misRepuestosRepuestoToAttach);
            }
            grupoDeConstruccion.setMisRepuestos(attachedMisRepuestos);
            em.persist(grupoDeConstruccion);
            if (miVehiculo != null) {
                miVehiculo.getMisGrupos().add(grupoDeConstruccion);
                miVehiculo = em.merge(miVehiculo);
            }
            for (Operacion misOperacionesOperacion : grupoDeConstruccion.getMisOperaciones()) {
                GrupoDeConstruccion oldMiGrupoDeConstruccionOfMisOperacionesOperacion = misOperacionesOperacion.getMiGrupoDeConstruccion();
                misOperacionesOperacion.setMiGrupoDeConstruccion(grupoDeConstruccion);
                misOperacionesOperacion = em.merge(misOperacionesOperacion);
                if (oldMiGrupoDeConstruccionOfMisOperacionesOperacion != null) {
                    oldMiGrupoDeConstruccionOfMisOperacionesOperacion.getMisOperaciones().remove(misOperacionesOperacion);
                    oldMiGrupoDeConstruccionOfMisOperacionesOperacion = em.merge(oldMiGrupoDeConstruccionOfMisOperacionesOperacion);
                }
            }
            for (Repuesto misRepuestosRepuesto : grupoDeConstruccion.getMisRepuestos()) {
                GrupoDeConstruccion oldMiGrupoDeConstruccionOfMisRepuestosRepuesto = misRepuestosRepuesto.getMiGrupoDeConstruccion();
                misRepuestosRepuesto.setMiGrupoDeConstruccion(grupoDeConstruccion);
                misRepuestosRepuesto = em.merge(misRepuestosRepuesto);
                if (oldMiGrupoDeConstruccionOfMisRepuestosRepuesto != null) {
                    oldMiGrupoDeConstruccionOfMisRepuestosRepuesto.getMisRepuestos().remove(misRepuestosRepuesto);
                    oldMiGrupoDeConstruccionOfMisRepuestosRepuesto = em.merge(oldMiGrupoDeConstruccionOfMisRepuestosRepuesto);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findGrupoDeConstruccion(grupoDeConstruccion.getCodigo()) != null) {
                throw new PreexistingEntityException("GrupoDeConstruccion " + grupoDeConstruccion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(GrupoDeConstruccion grupoDeConstruccion) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            GrupoDeConstruccion persistentGrupoDeConstruccion = em.find(GrupoDeConstruccion.class, grupoDeConstruccion.getCodigo());
            Vehiculo miVehiculoOld = persistentGrupoDeConstruccion.getMiVehiculo();
            Vehiculo miVehiculoNew = grupoDeConstruccion.getMiVehiculo();
            List<Operacion> misOperacionesOld = persistentGrupoDeConstruccion.getMisOperaciones();
            List<Operacion> misOperacionesNew = grupoDeConstruccion.getMisOperaciones();
            List<Repuesto> misRepuestosOld = persistentGrupoDeConstruccion.getMisRepuestos();
            List<Repuesto> misRepuestosNew = grupoDeConstruccion.getMisRepuestos();
            if (miVehiculoNew != null) {
                miVehiculoNew = em.getReference(miVehiculoNew.getClass(), miVehiculoNew.getNumeroPatente());
                grupoDeConstruccion.setMiVehiculo(miVehiculoNew);
            }
            List<Operacion> attachedMisOperacionesNew = new ArrayList<Operacion>();
            for (Operacion misOperacionesNewOperacionToAttach : misOperacionesNew) {
                misOperacionesNewOperacionToAttach = em.getReference(misOperacionesNewOperacionToAttach.getClass(), misOperacionesNewOperacionToAttach.getCodigo());
                attachedMisOperacionesNew.add(misOperacionesNewOperacionToAttach);
            }
            misOperacionesNew = attachedMisOperacionesNew;
            grupoDeConstruccion.setMisOperaciones(misOperacionesNew);
            List<Repuesto> attachedMisRepuestosNew = new ArrayList<Repuesto>();
            for (Repuesto misRepuestosNewRepuestoToAttach : misRepuestosNew) {
                misRepuestosNewRepuestoToAttach = em.getReference(misRepuestosNewRepuestoToAttach.getClass(), misRepuestosNewRepuestoToAttach.getCodigo());
                attachedMisRepuestosNew.add(misRepuestosNewRepuestoToAttach);
            }
            misRepuestosNew = attachedMisRepuestosNew;
            grupoDeConstruccion.setMisRepuestos(misRepuestosNew);
            grupoDeConstruccion = em.merge(grupoDeConstruccion);
            if (miVehiculoOld != null && !miVehiculoOld.equals(miVehiculoNew)) {
                miVehiculoOld.getMisGrupos().remove(grupoDeConstruccion);
                miVehiculoOld = em.merge(miVehiculoOld);
            }
            if (miVehiculoNew != null && !miVehiculoNew.equals(miVehiculoOld)) {
                miVehiculoNew.getMisGrupos().add(grupoDeConstruccion);
                miVehiculoNew = em.merge(miVehiculoNew);
            }
            for (Operacion misOperacionesOldOperacion : misOperacionesOld) {
                if (!misOperacionesNew.contains(misOperacionesOldOperacion)) {
                    misOperacionesOldOperacion.setMiGrupoDeConstruccion(null);
                    misOperacionesOldOperacion = em.merge(misOperacionesOldOperacion);
                }
            }
            for (Operacion misOperacionesNewOperacion : misOperacionesNew) {
                if (!misOperacionesOld.contains(misOperacionesNewOperacion)) {
                    GrupoDeConstruccion oldMiGrupoDeConstruccionOfMisOperacionesNewOperacion = misOperacionesNewOperacion.getMiGrupoDeConstruccion();
                    misOperacionesNewOperacion.setMiGrupoDeConstruccion(grupoDeConstruccion);
                    misOperacionesNewOperacion = em.merge(misOperacionesNewOperacion);
                    if (oldMiGrupoDeConstruccionOfMisOperacionesNewOperacion != null && !oldMiGrupoDeConstruccionOfMisOperacionesNewOperacion.equals(grupoDeConstruccion)) {
                        oldMiGrupoDeConstruccionOfMisOperacionesNewOperacion.getMisOperaciones().remove(misOperacionesNewOperacion);
                        oldMiGrupoDeConstruccionOfMisOperacionesNewOperacion = em.merge(oldMiGrupoDeConstruccionOfMisOperacionesNewOperacion);
                    }
                }
            }
            for (Repuesto misRepuestosOldRepuesto : misRepuestosOld) {
                if (!misRepuestosNew.contains(misRepuestosOldRepuesto)) {
                    misRepuestosOldRepuesto.setMiGrupoDeConstruccion(null);
                    misRepuestosOldRepuesto = em.merge(misRepuestosOldRepuesto);
                }
            }
            for (Repuesto misRepuestosNewRepuesto : misRepuestosNew) {
                if (!misRepuestosOld.contains(misRepuestosNewRepuesto)) {
                    GrupoDeConstruccion oldMiGrupoDeConstruccionOfMisRepuestosNewRepuesto = misRepuestosNewRepuesto.getMiGrupoDeConstruccion();
                    misRepuestosNewRepuesto.setMiGrupoDeConstruccion(grupoDeConstruccion);
                    misRepuestosNewRepuesto = em.merge(misRepuestosNewRepuesto);
                    if (oldMiGrupoDeConstruccionOfMisRepuestosNewRepuesto != null && !oldMiGrupoDeConstruccionOfMisRepuestosNewRepuesto.equals(grupoDeConstruccion)) {
                        oldMiGrupoDeConstruccionOfMisRepuestosNewRepuesto.getMisRepuestos().remove(misRepuestosNewRepuesto);
                        oldMiGrupoDeConstruccionOfMisRepuestosNewRepuesto = em.merge(oldMiGrupoDeConstruccionOfMisRepuestosNewRepuesto);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                int id = grupoDeConstruccion.getCodigo();
                if (findGrupoDeConstruccion(id) == null) {
                    throw new NonexistentEntityException("The grupoDeConstruccion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(int id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            GrupoDeConstruccion grupoDeConstruccion;
            try {
                grupoDeConstruccion = em.getReference(GrupoDeConstruccion.class, id);
                grupoDeConstruccion.getCodigo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The grupoDeConstruccion with id " + id + " no longer exists.", enfe);
            }
            Vehiculo miVehiculo = grupoDeConstruccion.getMiVehiculo();
            if (miVehiculo != null) {
                miVehiculo.getMisGrupos().remove(grupoDeConstruccion);
                miVehiculo = em.merge(miVehiculo);
            }
            List<Operacion> misOperaciones = grupoDeConstruccion.getMisOperaciones();
            for (Operacion misOperacionesOperacion : misOperaciones) {
                misOperacionesOperacion.setMiGrupoDeConstruccion(null);
                misOperacionesOperacion = em.merge(misOperacionesOperacion);
            }
            List<Repuesto> misRepuestos = grupoDeConstruccion.getMisRepuestos();
            for (Repuesto misRepuestosRepuesto : misRepuestos) {
                misRepuestosRepuesto.setMiGrupoDeConstruccion(null);
                misRepuestosRepuesto = em.merge(misRepuestosRepuesto);
            }
            em.remove(grupoDeConstruccion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<GrupoDeConstruccion> findGrupoDeConstruccionEntities() {
        return findGrupoDeConstruccionEntities(true, -1, -1);
    }

    public List<GrupoDeConstruccion> findGrupoDeConstruccionEntities(int maxResults, int firstResult) {
        return findGrupoDeConstruccionEntities(false, maxResults, firstResult);
    }

    private List<GrupoDeConstruccion> findGrupoDeConstruccionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from GrupoDeConstruccion as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public GrupoDeConstruccion findGrupoDeConstruccion(int id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(GrupoDeConstruccion.class, id);
        } finally {
            em.close();
        }
    }

    public int getGrupoDeConstruccionCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from GrupoDeConstruccion as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
